/**
 * 联合类型，使用 | 关键字：
 * 联合类型 表示 取值 可以为 多种类型 的一种
 * 即代表了一组类型的可用集合，只要 最终赋值的类型 属于 联合类型 的成员之一，就可以认为符合这个联合类型，
 * 联合类型对其成员并没有任何限制，除了对同一类型字面量的联合，还可以将各种类型混合到一起
 * 
 * 需要注意的是：
 * 对于联合类型中的函数类型，需要使用括号()包裹起来
 * 函数类型并不存在字面量类型，因此这里的 (() => {}) 就是一个合法的函数类型
 * 同时可以在联合类型中进一步嵌套联合类型，但这些嵌套的联合类型最终都会被展平到第一级中
 * 
 * 联合类型的常用场景之一是通过多个对象类型的联合，来实现手动的互斥属性，
 * 即这一属性如果有字段1，那就没有字段2
 * */

//类型标注 中使用 联合类型： string | number
let myFavoriteNumber: string | number  = 'two';
let myFavoriteNumberA: string | number  = 2;

//接口中使用联合类型：true | string | 599 | {} | (() => {}) | (1 | 2)
 interface Tmp {
    mixed: true | string | 599 | {} | (() => {}) | (1 | 2)
}

//联合类型：通过多个对象类型的联合，来实现手动的互斥属性
interface Tmp1 {
    user:
    {
        vip: true;
        expires: string;
    }
    | {
        vip: false;
        promotion: string;
    };
}

declare var tmp: Tmp1;

if (tmp.user.vip) {
    console.log(tmp.user.expires);
}

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }